/**
 * 基础的类型层级，分别是从上往下：
 * 
 * Top Type：any、unknown
 * 
 * 顶级原型：Object
 * 
 * 装箱类型：String、Boolean、Number
 * 
 * 基础类型（拆箱类型）：string、boolean、number、null、undefined、void
 * 
 * 对应的字面量类型：true、999 等
 * 
 * Bottom Type：never
 * 
*/

/**
 * 一、判断类型兼容性的方式：
 * 1、使用 条件类型 来 判断类型兼容性
 * 2、通过 赋值 来 进行兼容性检查的方式
*/

//1、使用 条件类型 来 判断类型兼容性
type Result = 'hanxuming' extends string ? 1 : 2;

//2、通过 赋值 来 进行兼容性检查的方式
declare let source: string;
declare let anyType: any;
declare let neverType: never;
anyType = source;
// 不能将类型“string”分配给类型“never”。
neverType = source;

/**
 * 二、结合 类型层级 的结论，可以书写出这样一条类型层级链：
*/
//其返回的结果为 8，这意味着所有条件均成立
type TypeChain = never extends 'hanxuming'
  ? 'hanxuming' extends 'hanxuming' | '599'
  ? 'hanxuming' | '599' extends string
  ? string extends String
  ? String extends Object
  ? Object extends any
  ? any extends unknown
  ? unknown extends any
  ? 8
  : 7
  : 6
  : 5
  : 4
  : 3
  : 2
  : 1
  : 0

/**
 * 三、如果结合 结构化类型系统 与 类型系统 设定，还可以构造出一条更长的类型层级链：
*/
//返回结果也为 8，
type VerboseTypeChain = never extends 'hanxuming'
  ? 'hanxuming' extends 'hanxuming' | 'budulin'
  ? 'hanxuming' | 'budulin' extends string
  ? string extends {}
  ? string extends String
  ? String extends {}
  ? {} extends object
  ? object extends {}
  ? {} extends Object
  ? Object extends {}
  ? object extends Object
  ? Object extends object
  ? Object extends any
  ? Object extends unknown
  ? any extends unknown
  ? unknown extends any
  ? 8
  : 7
  : 6
  : 5
  : 4
  : 3
  : 2
  : 1
  : 0
  : -1
  : -2
  : -3
  : -4
  : -5
  : -6
  : -7
  : -8

/**
 * 四、数组和元组是一个比较特殊的部分
*/
type Result40 = [number, number] extends number[] ? 1 : 2; // 1
type Result41 = [number, string] extends number[] ? 1 : 2; // 2
type Result42 = [number, string] extends (number | string)[] ? 1 : 2; // 1
type Result43 = [] extends number[] ? 1 : 2; // 1，成员是未确定的，等价于 never[] extends number[]，
type Result44 = [] extends unknown[] ? 1 : 2; // 1，成员是未确定的，等价于 never[] extends unknown[]，
type Result45 = number[] extends (number | string)[] ? 1 : 2; // 1
type Result46 = any[] extends number[] ? 1 : 2; // 1
type Result47 = unknown[] extends number[] ? 1 : 2; // 2
type Result48 = never[] extends number[] ? 1 : 2; // 1

//export {}：解决“无法重新声明块范围变量”错误提示问题
export { }
